﻿using System.Collections.Generic;
using UnityEngine;

public class ObjectPooler : MonoBehaviour
{
    [SerializeField] private GameObject prefab;         //预制体
    [SerializeField] private int poolSize = 10;

    private List<GameObject> _pool; //List<GameObject> 是一个泛型列表（List），用于存储 GameObject 类型的对象。在这个对象池管理器中，它被用于存储对象实例。
    private GameObject _poolContainer; //创建一个游戏对象（池容器）用于储存对象池

    private void Awake()  
    {
        _pool = new List<GameObject>();  //_pool是一个变量，用于存储 GameObject 实例。通过泛型列表 List<GameObject>，可以在其中添加、删除和访问 GameObject 对象。
        _poolContainer = new GameObject($"Pool - {prefab.name}");  //实例化一个游戏对象

        CreatePooler();
    }

    private void CreatePooler()  //给_pool池中创建实例，个数为poolSize
    {
        for(int i = 0; i < poolSize; i++)
        {
            _pool.Add(CreateInstance());
        }
    }

    private GameObject CreateInstance()  //创建实例函数
    {
        GameObject newInstance=Instantiate(prefab);  //实例化预制体并储存在变量newInstance中
        newInstance.transform.SetParent(_poolContainer.transform);
        //.transform 被用于设置新实例的父对象。通过将新实例的父对象设置为 _poolContainer.transform，新实例将成为 _poolContainer 的子对象，从而更好地组织和管理对象池中的实例。
        newInstance.SetActive(false);   //设置为未激活状态
        return newInstance;           //返回一个实例化对象
    }

    public GameObject GetInstanceFromPool()  //从池中拿取未激活的实例化对象，如果都已经激活，则创建未激活的实例化对象
    {
        for(int i = 0; i < _pool.Count; i++)
        {
            if (!_pool[i].activeInHierarchy)
            {
                return _pool[i];
            }
        }
        return CreateInstance();
    }

    public static void ReturnToPool(GameObject instance)
    {
        instance.SetActive(false);
    }
}


/*_pool: _pool 是一个泛型列表（List<GameObject>），用于存储 GameObject 类型的对象实例。
 * 它是对象池的核心数据结构，用于管理和存储可重复利用的对象。通过 _pool，可以方便地添加、删除和访问对象实例，以满足游戏中对对象的需求。
 * _poolContainer: _poolContainer 是一个 GameObject 实例，用作对象池的容器。它是一个空的游戏对象，专门用于组织和管理对象池中的对象实例。
 * 通过将对象实例的父对象设置为 _poolContainer，可以将它们作为子对象进行组织，并在场景中形成层次结构。
 * 这样做可以更好地组织和管理对象池中的对象实例，使代码结构更清晰、易于维护。*/
